import numpy as np
import openpyxl
import pandas as pd

list = []


# 提取对应数据
def read_column_from_excel(file_path, sheet_name, column_name):
    """
    此函数从Excel文件中读取指定的列。

    参数:
    file_path (str): Excel文件的路径。
    sheet_name (str): 工作表的名称。
    column_name (str): 列的名称。

    返回:
    pandas.Series: 从Excel文件中读取的列。
    """
    # Load the Excel file
    df = pd.read_excel(file_path, sheet_name=sheet_name)

    # Return the specified column
    return df[column_name].tolist()


# 写入excel
def write_to_excel(file_path, sheet_name, row, column, data):
    # 打开Excel文件
    workbook = openpyxl.load_workbook(file_path)

    # 选择要操作的工作表
    sheet = workbook[sheet_name]

    # 将数据写入到指定的单元格
    sheet.cell(row=row, column=column).value = data

    # 保存工作簿到文件
    workbook.save(file_path)


# 求均方误差
def mean_squared_error(y_true, y_pred):
    """
    此函数计算两个多维向量之间的均方误差。

    参数:
    y_true (numpy array): 真实值。
    y_pred (numpy array): 预测值。

    返回:
    float: 真实值和预测值之间的均方误差。
    """
    return np.mean((y_true - y_pred) ** 2)


# 求多维向量夹角的cos值
def cos_angle(v1, v2):
    # 计算两个向量的点积
    dot_product = np.dot(v1, v2)

    # 计算每个向量的模（长度）
    magnitude_v1 = np.linalg.norm(v1)
    magnitude_v2 = np.linalg.norm(v2)

    # 计算并返回两个向量之间夹角的余弦值
    cos_angle = dot_product / (magnitude_v1 * magnitude_v2)
    return cos_angle


# 求多维向量曼哈顿距离
def manhattan_distance(v1, v2):
    # 计算并返回两个向量之间的曼哈顿距离
    return np.sum(np.abs(v1 - v2))


for i in range(106, 131):
    a = read_column_from_excel('excel.file/三维荧光扫描数据_向量.xlsx', 'Sheet1', 'NF' + str(i) + '.txt')
    list.append(a)
# print(list)
# print(len(list))
# ===============================================均方误差计算代码====================================================
# for i in range(0, 25):
#     for j in range(0, 25):
#         mse = mean_squared_error(np.array(list[i]), np.array(list[j]))
#         write_to_excel('excel.file/三维荧光均方误差矩阵.xlsx', 'Sheet1', i + 2, j + 2, mse)
# ==============================================向量夹角cos值计算代码================================================
# for i in range(0, 25):
#     for j in range(0, 25):
#         mse = cos_angle(np.array(list[i]), np.array(list[j]))
#         write_to_excel('excel.file/三维荧光夹角cos值矩阵.xlsx', 'Sheet1', i + 2, j + 2, mse)
# ==============================================曼哈顿距离代码================================================
for i in range(0, 25):
    for j in range(0, 25):
        mse = manhattan_distance(np.array(list[i]), np.array(list[j]))
        write_to_excel('excel.file/三维荧光曼哈顿距离矩阵.xlsx', 'Sheet1', i + 2, j + 2, mse)
